package com.cfpl.project_common.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.cfpl.project_common.enums.CodeEnum;
import com.cfpl.project_common.exception.BusException;
import com.cfpl.project_common.pojo.Admin;

import java.util.Date;

public class JWTUtil {
  //token过期时间，1天
  private static final Long EXPIRE_DATE = 1000*60*60*24L;
  // 秘钥 绿源味道小写
  private static final String SECRET = "lvyuanweidao";
  // 签发者 绿源味道大写
  private static final String ISSUER = "LVYUANWEIDAO";


  /**
   * 签名生成
   * @param admin
   * @return
   */
  public static String sign(Admin admin){
    String token = JWT.create()
         .withIssuer(ISSUER)                                            // 签发者
         .withIssuedAt(new Date())                                      // 签发时间
         .withExpiresAt(new Date(new Date().getTime() + EXPIRE_DATE))   // 过期时间
         .withSubject(admin.getAdminName())                             // 保存用户名
         .withClaim("adminId",admin.getAdminId())
         .sign(Algorithm.HMAC256(SECRET));                              // 秘钥
    return token;
   }


  /**
   * 签名解析
   * @param token 签名字符串
   * @return 用户名
   */
  public static String verify(String token){
    try {
        // 返回用户名
        return JWT
             .require(Algorithm.HMAC256(SECRET))
             .withIssuer(ISSUER)
             .build()
             .verify(token)
             .getSubject();
     } catch (Exception e){
      throw new BusException(CodeEnum.USER_NOT_LOGIN);
     }
  }
    /**
     * 签名解析
     * @param token 签名字符串
     * @return 解析得出的用户ID
     */
    public static Long getUserId(String token){

        try {
            return JWT.require(Algorithm.HMAC256(SECRET))
                    .withIssuer(ISSUER)
                    .build()
                    .verify(token)
                    .getClaim("adminId")
                    .asLong();
        } catch (Exception e){
            throw new BusException(CodeEnum.USER_NOT_LOGIN);
        }
    }
}
